/******************************************************************************
 * \brief	通信中的链路层处理（网络套接字）
 * \details	用来模拟两个嵌入式设备间的串口通信；有点区别的是套接字是可靠通信，串口是
 *			不可靠通信，套接字可以不使用校验，串口必须要使用校验
 * \note	File format: UTF-8，中文编码：UTF-8
 * \author	将狼才鲸
 * \date	2023-03-25
 ******************************************************************************/

#ifndef _SCP_DEV_SOCKET_H_
#define _SCP_DEV_SOCKET_H_

/*********************************** 头文件 ***********************************/
#include "scp_devs.h"

/********************************** 接口函数 **********************************/
/**
 * \brief	初始化网络套接字进程间通信链路
 * \param	hwaddr:	如果是多核通信，可以使用内存地址直接传递数据
 * \param	type:	指定通信设备，如串口、网络、核间通信、进程间通信等
 */
extern scp_dev_t *scpdev_socket_init(uint32_t hwaddr, int devtype);

/**
 * \brief	设备销毁
 */
extern int scpdev_socket_exit(scp_dev_t *pdev);

/**
 * \brief	准备好设备，清空设备缓存
 */
extern int scpdev_socket_start(scp_dev_t *pdev);

/**
 * \brief	释放设备缓存
 */
extern int scpdev_socket_stop(scp_dev_t *pdev);

/**
 * \brief	设备发送数据
 * \param	seg:	段句柄
 * \param	wmode:	单次消息发送的某个阶段：RWMODE_START、RWMODE_FINISH、RWMODE_REQUEST、RWMODE_RESPOND
 */
extern int scpdev_socket_send(segment_t *seg, int wmode);

/**
 * \brief	设备接收数据包；有接收队列，从中获取最早到达的包
 * \details	轮询的读消息，一次轮询不一定读到完整的包，可能多次轮询后才能收满包
 * \param	pdev:	设备句柄
 * \param	rmode:	读数据时的步骤：RWMODE_REQUEST...
 * \return	已收完则返回数据包，或者未收完或未收到返回NULL
 */
extern segment_t *scpdev_socket_read(scp_dev_t *pdev, int rmode);

#endif /* _SCP_DEV_SOCKET_H_ */

/*********************************** 文件尾 ***********************************/
